package com.leesche.zcsp.node.web.service;

import java.util.List;

import com.leesche.zcsp.node.web.dao.SysUserDao;
import com.leesche.zcsp.node.web.model.SysRoleModule;
import com.leesche.zcsp.node.web.model.SysUser;
import com.leesche.zcsp.node.web.model.SysUserCriteria;
import com.leesche.zcsp.node.web.service.impl.data.read.QuerySysUserCondition;
import com.leesche.zcsp.node.web.service.impl.data.read.SysUserDto;
import com.leesche.zcsp.node.web.vo.Principal;

/**
 * @author 陈立勇
 * @version V1.0
 * @Title: SysUserService.java
 * @Description: TODO(系统用户Service接口)
 * @date 2016年9月18日 上午9:36:35
 */
public interface SysUserService
        extends
        BaseService<SysUser, SysUserCriteria, SysUserDto, QuerySysUserCondition, Long> {

	/*
     * public Principal findSysUserByUsernameAndPassword(QuerySysUserCondition
	 * condition);
	 */

    /**
     * @param sysUser
     * @return 用户信息
     * @Title: findUserByUsername
     * @Description: TODO(根据用户名或用户邮箱或移动电话获取用户信息)
     * @author Jerry Chen
     * @date 2016年10月9日 下午6:03:58
     */
    public SysUser findUserByUsername(SysUser sysUser);

    /**
     * @param childUsers 子用户集合
     * @return 添加结果（0:设置失败 / 1或大于1：设置成功）
     * @Title: addChildUsers
     * @Description: TODO(批量添加子用户)
     * @author Jerry Chen
     * @date 2016年10月5日 上午1:34:30
     */
    int addChildUsers(List<SysUser> childUsers);

    /**
     * @param user
     * @return 修改密码结果
     * @Title: changePassword
     * @Description: TODO(修改用户登录密码)
     * @author Jerry Chen
     * @date 2016年10月8日 上午10:30:32
     */
    int changePassword(SysUser user);

    /**
     * @param user 用户信息
     * @return 修改密码结果
     * @Title: changeTransferPassword
     * @Description: TODO(修改用户支付密码)
     * @author Jerry Chen
     * @date 2016年10月8日 上午10:33:01
     */
    int changeTransferPassword(SysUser user);

    /**
     * @param parentUser 父级用户信息
     * @return 子用户集合
     * @Title: findChildUsers
     * @Description: TODO(获取子用户集合)
     * @author Jerry Chen
     * @date 2016年10月9日 上午11:30:26
     */
    List<SysUser> findChildUsers(SysUser parentUser);

    /**
     * @param parentUserID 　父级用户的ID
     * @return 最后一位子用户
     * @Title: findLastUserByParentID
     * @Description: TODO(根据父级用户的ID获取其下的最后一位子用户)
     * @author Jerry Chen
     * @date 2016年10月11日 下午5:09:20
     */
    SysUser findLastUserByParentID(Long parentUserID);

    /**
     * @param condition 用户信息查询条件
     * @return 子账户信息
     * @Title: findChildUserByPrientIDAndRoleID
     * @Description: TODO(根据父级ID和角色ID获取子账户信息)
     * @author Jerry
     * @date 2016-10-20 01:15:53
     */
    List<SysUserDto> findChildUserByPrientIDAndRoleID(QuerySysUserCondition condition);

    /**
     * @param user               需创建的用户信息
     * @param pubDiscountService 套餐service接口
     * @return 已持久化的用户信息
     * @Title: createUser
     * @Description: TODO(创建用户信息)
     * @author Jerry
     * @date 2016-11-15 10:31:58
     */
    SysUser createUser(SysUser user, PubDiscountService pubDiscountService) throws Exception;

    /**
     * @param parentUser 父级用户信息
     * @return 数据库操作结果
     * @Title: setupUserRoleBatch
     * @Description: TODO(用户分配角色（批量分配） )
     * @author Jerry
     * @date 2016-11-15 10:33:38
     */
    int setupUserRoleBatch(SysUser parentUser);

    /** 
     * @Title: countUserByCondition(QuerySysUserCondition condition)
     * @Description: TODO( 根据查询条件统计用户数量 )
     * @author Jerry Chan
     * @date 2016/11/27 15:06
     * @return 用户信息
     */
    Integer countUserByCondition(QuerySysUserCondition condition);

    /**
     * @Title: addUserInfo(SysUser user)
     * @Description: TODO( 增加用户信息并增加子用户信息 )
     * @author Jerry Chan
     * @date 2017/1/3 16:33
     * @return
     */
    SysUser addUserInfo(SysUser user) throws Exception;

    /**
     * @Title: saveLoginState(SysUser sysUser,Integer loginType)
     * @Description: TODO( 保存用户登录状态 )
     * @author Jerry Chan
     * @date 2017/1/5 15:09
     * @return
     */
    void saveLoginState(SysUser sysUser,List<Long> userModules,Integer loginType);

    /**
     * @Title: saveLoginState(SysUser sysUser,Integer loginType)
     * @Description: TODO( 保存用户登录状态 )
     * @author Jerry Chan
     * @date 2017/1/5 15:09
     * @return
     */
    void saveLoginState(SysUser sysUser,List<Long> userModules,Integer loginType,String usertoken);

}